#include "../../include/client_handle.h"

/***************************************************
函数名:admin_chat
功能:管理员聊天功能
传入参数:int sockfd,struct message *a
返回值:退出返回FAULT
***************************************************/
int admin_chat(int sockfd,struct message *a)  
{
    char str[MAXLEN];
    char buf[MAXLEN];
    time_t timep;
    sprintf(chat_log,"./chat_log/%s.txt",(*a).name);
    if((fd=my_open(chat_log,O_RDWR|O_CREAT|O_APPEND,0777)) < 0)
    {
        printf("打开聊天记录失败!");
	exit(1);
    }
    setbuf(stdin,NULL);
    my_strcpy((*a).flag,"all");
    printf("尊敬的%s你好，如需帮助请输入：.help\n",locname);
    while(1)
	{
		memset((*a).msg,0,strlen((*a).msg));
		memset(str,0,strlen(str));
		usleep(100000);
		printf("TO %s:\n",(*a).flag);
		setbuf(stdin,NULL);
		gets(str);
		if(OK == help(str))                      //提示信息  
		{
		    continue;
		}
		my_strcpy((*a).name,locname);
		my_strcpy(buf,(*a).flag);
		cutStr(str,(*a).flag,15,(*a).msg,MAXLEN,'$');    //调用字符切割函数  
		expression((*a).name,(*a).msg);               //表情替换函数 
		common_use_words((*a).msg);                    //常用语使用函数
		if(my_strcmp((*a).flag,"exit") == 0)
		{
		    return FAULT;
		}
		if(my_strcmp((*a).flag,"view") == 0)           
		{
		    my_send(sockfd,a,sizeof((*a)),0);       //请求查看在线用户
	     	    my_strcpy((*a).flag,buf);
		    continue;
		}
		if(my_strcmp((*a).flag,"all") == 0)
		{
		    my_send(sockfd,a,sizeof(*a),0);        
		    continue;
		}
		
	        if ((my_strcmp((*a).flag,"trans") == 0) && (savefilefd <=0))
		{
			//接受文件
    		    if ((my_strcmp((*a).msg,"agree") == 0) && (savefilefd == 0))
		    {
		        char savefilename[MAXLEN];
			my_strcpy((*a).addressee,filefromuser);
			printf("请输入你想保存的文件名：\n");
			do
			{
			    setbuf(stdin,NULL);
			    gets(savefilename);
			    savefilefd = open(savefilename,O_RDWR|O_CREAT|O_EXCL,0777);
			    if(savefilefd == -1)
			    {
			        printf("文件已存在，你重新输入：\n");
			    }
			}while(savefilefd == -1);
			if(savefilefd < 0)
			{
			    printf("接收文件失败!\n");
			    savefilefd = -1;
			}
			else
			{
			    my_strcpy((*a).msg,"agree");
			    my_send(sockfd,a,sizeof(*a),0);
			    printf("文件接收中……\n");
			}

		   }else
			   //发送文件
		   {
				memset(str,0,strlen(str));
				cutStr((*a).msg,(*a).addressee,20,str,MAXLEN,'$');
				if (str[0] != '\0' && (*a).addressee[0] != '\0')
				{
					char transfileallname[22];
					sprintf(transfileallname,"./%s",str);
					savefilefd = open(str,O_RDWR,0666);
					if(savefilefd < 0)
					{
						printf("打开文件失败!\n");
						savefilefd = -1;
					}else
					{
						memset((*a).msg,0,strlen((*a).msg));
						my_strcpy((*a).msg,str);
						my_send(sockfd,a,sizeof(*a),0);
					}
				}else
				{
					my_strcpy((*a).msg,"disagree");
					my_strcpy((*a).name,locname);
					my_strcpy((*a).addressee,filefromuser);
					my_send(sockfd,a,sizeof(*a),0);
				}
			}
			my_strcpy((*a).flag,buf);
			continue;
		}
		if (my_strcmp((*a).flag,"trans") == 0)
		{
			my_strcpy((*a).flag,buf);
		}
		else
		{
			my_strcpy(buf,(*a).flag);
			my_strcpy((*a).addressee,(*a).flag);
			my_strcpy((*a).flag,"personal");
			my_send(sockfd,a,sizeof(*a),0);             //发送私信
			my_strcpy((*a).flag,buf);
			time (&timep);
			memset(str,0,strlen(str));
			sprintf(str,"%s你对 %s 说: %s\n",ctime(&timep),(*a).flag,(*a).msg);
			printf("%s",str);
			my_write(fd,str,strlen(str));              //写入聊天记录文件中
		}
	}
}

/***************************************************
函数名:admin_kick
功能:管理员替人操作
传入参数:int sockfd,struct message *a
返回值:成功返回1，否则返回0
***************************************************/
int admin_kick(int sockfd,struct message *a)     
{
    char str[MAXLEN]; 
    do
    {
        printf("你想把谁踢出聊天室:\n");
	    setbuf(stdin,NULL);         //清空缓存
	    gets(str);                  
    }while(my_strcmp(str,"admin") == 0);                  
	if(my_strcmp(str,"") == 0)           //str为空
	{
        return FAULT;
	}
	else
	{
        my_strcpy((*a).flag,"admin_kick");            //管理员踢人标志
        my_strcpy((*a).msg,str);
        my_send(sockfd,a,sizeof(struct message),0);   //客户端把要求传给服务器       
	}
	return OK;
}
/***************************************************
函数名:admin_screen
功能:管理员禁言功能
传入参数:int sockfd,struct message *a
返回值:成功返回1，否则返回0
***************************************************/
int admin_screen(int sockfd,struct message *a)
{
    char str[MAXLEN];
    do
    {
        printf("你想禁言／解禁谁:\n");
      	setbuf(stdin,NULL);
	    gets(str);
    }while(my_strcmp(str,"admin") == 0);
	if(my_strcmp(str,"") == 0) 
	{
		return FAULT;
	}
	else
	{
        my_strcpy((*a).flag,"admin_screen");        //禁言标志
        my_strcpy((*a).msg,str);
	    my_send(sockfd,a,sizeof(struct message),0);  
	}
	return OK;
}
/***************************************************
函数名:login_admin
功能:管理员登录
传入参数:struct message *a
返回值:成功返回1，否则返回0
***************************************************/
int login_admin(struct message *a)
{
	int do_number;						
	pthread_t pid;
	memset((*a).msg,0,strlen((*a).msg));                              //清空消息
	my_strcpy(chat_log,"admin");                                          //聊天记录名
	pthread_create(&pid,NULL,(void*)handlerecvmsg,(void *)&sockfd);     //创建线程    
	while(1)
	{
		usleep(500000);
		do
		{
			printf("1.踢人  2.禁言／解禁  3.查看在线用户  4.聊天  5.退出\n");
			printf("please input:\n");       
			setbuf(stdin,NULL);                                 //清空缓存
			scanf(" %d",&do_number);
			system("clear");
			setbuf(stdin,NULL);                                 //清空缓存
		}while((do_number != 1) && (do_number != 2) && (do_number != 3) && (do_number != 4)&& (do_number != 5));
	        switch(do_number)
		{

			case 1:
		        {

	             	   	admin_kick(sockfd,a);               
			    	break;
			}
			case 2:
			{
				admin_screen(sockfd,a);       
		        break;
			}
			case 3:
		    	{
				my_strcpy((*a).flag,"view");
			    	my_send(sockfd,a,sizeof(*a),0);
			    	//需要进行接受，　否则无法显示在线用户;
			    	break;
		    	}
			case 4:
			{
				admin_chat(sockfd,a);
		        	break;
			}
    	    		case 5:
		    	{
		        	my_close(sockfd);
			    	return FAULT;
		    	}
			default:
			{
	    			break;
			}
		}
	}
	return OK;
}



